#ifndef B2D_IUNCOPYABLE_H
#define B2D_IUNCOPYABLE_H

#include "Prerequisites.h"

NS_B2D_BEGIN

////////////////////////////////////////////////////////////////////////////////////////////////////
/// \brief	Base class / interface for object that are not allowed to be copied directly.
////////////////////////////////////////////////////////////////////////////////////////////////////
class B2D_API IUncopyable
{
	B2D_INTERFACE(IUncopyable)

private:
    IUncopyable(const IUncopyable&);
    const IUncopyable& operator= (const IUncopyable&);
};

////////////////////////////////////////////////////////////////////////////////////////////////////
/// \brief	Same as IUncopyable but it doesn't have a virtual constuctor. This allows it to be
/// 		used in a POD manner (no vtable) but deleting a pointer to UncopyableNonVirtual is
/// 		not safe (good idea to inherit privately).
////////////////////////////////////////////////////////////////////////////////////////////////////
class B2D_API IUncopyableNonVirtual
{
protected:
	IUncopyableNonVirtual(void) { }

private:
	IUncopyableNonVirtual(const IUncopyableNonVirtual&);
    const IUncopyableNonVirtual& operator= (const IUncopyableNonVirtual&);
};

NS_B2D_END

#endif